home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Libraries / SAT 2.1.2 / HeartQuest sample ƒ / sFlypaper.p < prev    next >
Encoding:
Text File  |  1994-06-02  |  3.7 KB  |  153 lines  |  [TEXT/PJMM]

  1. {===============================================}
  2. {================= Flypaper sprite unit ================}
  3. {===============================================}
  4.  
  5. { Example file for Ingemars Sprite Animation Toolkit. }
  6. { © Ingemar Ragnemalm 1992 }
  7. { See doc files for legal terms for using this code. }
  8.  
  9. unit sFlypaper;
  10.  
  11. { Sprite unit. A sprite unit should include the following routines:}
  12. { Init-procedure, that initializes private bitmaps}
  13. { Setup-procedure, that sets variables other than the standard ones set by MakeSprite }
  14. { Handle-procedure, to be called once per iteration until the sprite dies }
  15. { Hittask-procedure (optional), for advanced collission handling. }
  16.  
  17. { Flypaper object, the "enemies" in the HeartQuest game. }
  18.  
  19. interface
  20.  
  21.     uses
  22.         SAT, scores, SoundConst, GameGlobals;
  23.  
  24.     var
  25.         slowcount: integer;
  26.  
  27.     procedure InitFlypaper;
  28.     procedure SetupFlypaper (mp: SpritePtr);
  29.     procedure HandleFlypaper (me: SpritePtr);
  30.     procedure HandleDyingFlypaper (me: SpritePtr); {Behöver inte vara extern}
  31.  
  32. implementation
  33.  
  34.     var
  35.         FlypaperFace: array[1..6] of FacePtr;
  36.         DyingFlypaperFace: array[1..3] of FacePtr;
  37.  
  38.     procedure InitFlypaper;
  39.         var
  40.             ii: integer;
  41.             h: Handle;
  42.     begin
  43.         for ii := 1 to 6 do
  44.             FlypaperFace[ii] := GetFace(156 + ii);
  45.         for ii := 1 to 3 do
  46.             DyingFlypaperFace[ii] := GetFace(143 + ii);
  47.     end;
  48.  
  49.     procedure SetupFlypaper (mp: SpritePtr);
  50.     begin
  51.         mp^.face := FlypaperFace[1];
  52.         mp^.mode := rand(3) + 1; { icon number }
  53.         SetRect(mp^.hotRect, -14 + 16, -28 + 32, 14 + 16, 0 + 32);
  54.         mp^.task := @HandleFlypaper;
  55.     end;
  56.  
  57.     procedure HandleFlypaper (me: SpritePtr);
  58.         var
  59.             mp: Spriteptr;
  60.             divmed: integer;
  61.     begin
  62.         if me^.kind <> -3 then
  63.             begin
  64.                 me^.kind := -3;
  65.                 if slowcount < 10 then
  66.                     begin
  67.                         slowcount := 50;
  68.                         SATSoundPlay(Splatt2SndH, 1, true);
  69.                         me^.task := @HandleDyingFlypaper;
  70.                         me^.kind := 0;
  71.                     end;
  72.             end;
  73.  
  74.         me^.mode := me^.mode + 1;
  75.         if me^.mode = 7 then
  76.             me^.mode := 1;
  77.         me^.face := FlypaperFace[me^.mode];
  78.  
  79.         me^.position.h := me^.position.h + me^.speed.h;
  80.         me^.position.v := me^.position.v + me^.speed.v;
  81.  
  82.         if Rand100 < 7 then
  83.             me^.speed.h := rand(15) - 8;
  84.         if Rand100 < 4 then
  85.             me^.speed.v := rand(7) - 4;
  86.  
  87.         if (level > 4) then
  88.             if rand100 < level then
  89.                 if slowcount = 0 then
  90.                     begin
  91.                         me^.speed.h := PlayerPos.h - me^.position.h;
  92.                         me^.speed.v := PlayerPos.v - me^.position.v;
  93.                         divmed := abs(me^.speed.h) + abs(me^.speed.v);
  94.                         if divmed > level then
  95.                             begin
  96.                                 me^.speed.h := me^.speed.h * 2 * level div divmed;
  97.                                 me^.speed.v := me^.speed.v * 2 * level div divmed;
  98.                             end;
  99.                     end
  100.                 else {Player stunned - keep away!}
  101.                     begin
  102.                         me^.speed.h := -(PlayerPos.h - me^.position.h);
  103.                         me^.speed.v := -(PlayerPos.v - me^.position.v);
  104.                         divmed := abs(me^.speed.h) + abs(me^.speed.v);
  105.                         if divmed > level then
  106.                             begin
  107.                                 me^.speed.h := me^.speed.h * 2 * level div divmed;
  108.                                 me^.speed.v := me^.speed.v * 2 * level div divmed;
  109.                             end;
  110.                     end;
  111.  
  112.         if me^.position.h < 0 then
  113.             begin
  114.                 me^.position.h := 0;
  115.                 me^.speed.h := 1;
  116.             end;
  117.         if me^.position.h > gSAT.offSizeH - xsize then
  118.             begin
  119.                 me^.position.h := gSAT.offSizeH - xsize;
  120.                 me^.speed.h := -1;
  121.             end;
  122.         if me^.position.v < 0 then
  123.             begin
  124.                 me^.position.v := 0;
  125.                 me^.speed.v := 1;
  126.             end;
  127.         if me^.position.v > gSAT.offSizeV - 32 then
  128.             begin
  129.                 me^.position.v := gSAT.offSizeV - 32;
  130.                 me^.speed.v := -1;
  131.             end;
  132.     end;
  133.  
  134.     procedure HandleDyingFlypaper (me: SpritePtr);
  135.         var
  136.             mp: Spriteptr;
  137.             divmed: integer;
  138.     begin
  139.         if me^.kind <> 0 then
  140.             me^.kind := 0;
  141.  
  142.         me^.mode := me^.mode + 1;
  143.         if me^.mode >= 4 then
  144.             me^.mode := 1;
  145.         me^.face := DyingFlypaperFace[me^.mode];
  146.  
  147.         me^.position.v := me^.position.v + 8;
  148.  
  149.         if me^.position.h > gSAT.offSizeH then
  150.             me^.task := nil;
  151.     end;
  152.  
  153. end.